package cn.layou.thread;

/**
 * 展示线程三大特性-可见性
 * 每个线程本地都会缓存一份running的缓存，改也是改本地缓存，其他线程本地缓存不会被修改
 * volatile作用
 *  1) 对于volatile修改变量对于其他线程立马可见
 *  2) volatile修饰引用类型，只能保证引用本身的可见性，不能保证内部字段的可见性
 *
 * @author layou
 * @date 2021-04-16
 **/
public class T02_ThreadVolatile {
    private static /*volatile*/ boolean running = true;
    //private static volatile boolean running = true;

    private static void m() {
        System.out.println("m start");
        while (running) {
            //会触发线程可见性,因为System.out.println()中使用了synchronized,会触发线程可见性机制
            //System.out.println("hello");
        }
        System.out.println("m end");
    }

    public static void main(String[] args) throws InterruptedException {
        new Thread(T02_ThreadVolatile::m, "name").start();

        Thread.sleep(2000);

        running = false;
    }
}
